package br.com.fogas.medicao.activity.helper;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.entidade.MedidorHistorico;
import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.database.entidade.NotaItem;
import br.com.fogas.database.entidade.NotaOcorrencia;
import br.com.fogas.database.entidade.PlanoVisitas;
import br.com.fogas.database.enums.NotaOcorrenciaStatusEnum;
import br.com.fogas.medicao.R;
import br.com.fogas.utils.dialog.DialogAlert;
import br.com.fogas.utils.dialog.ProgressDialogBuilder;
import br.com.fogas.utils.task.ServiceTask;
import br.com.fogas.medicao.activity.ConcluirSimulNotaActivity;
import br.com.fogas.medicao.activity.dialog.DialogMenuFoto;
import br.com.fogas.medicao.activity.dialog.DialogMenuFoto.DialogMenuFotoListener;
import br.com.fogas.medicao.activity.dialog.DialogObservacao;
import br.com.fogas.medicao.activity.dialog.DialogObservacao.DialogObservacaoListener;
import br.com.fogas.medicao.activity.dto.RetornoAutorizacaoNotaDto;
import br.com.fogas.medicao.application.ApplicationFogas;
import br.com.fogas.medicao.application.Constants;
import br.com.fogas.medicao.business.EmitirNotaContigenciaBusiness;
import br.com.fogas.medicao.utils.MedicaoUtils;
import br.com.fogas.notafiscal.DescontosDto;
import br.com.fogas.notafiscal.NotaFiscalEngine;
import br.com.fogas.utils.FogasUtility;
import br.com.fogas.utils.StringUtility;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class SimulacaoHelper {
	
	private Fragment fragment;
	private FogasDatabase database;
	private TextView labelClientePanel;
	private TextView condPgto;
	private TextView nfSerie;
	private TextView totalNota;
	private ImageView foto;
	private TableLayout tableProdutos;
	private TextView labelSemDesconto;
	private TableLayout tableDescontos;
	private TextView labelCondMedio;
	private TableLayout tableHistMedicao;
	private Button btnConcluirSimulacao;
	private Button btnObsVisita;
	private RetornoAutorizacaoNotaDto retornoNota;
	private Uri fotoUri;
	private TextView textObservacao;
 
	public SimulacaoHelper(Fragment fragment, RetornoAutorizacaoNotaDto retornoNota) {
		this.fragment = fragment;
		this.retornoNota = retornoNota;
		this.database = new FogasDatabase(fragment.getActivity());
		this.labelClientePanel = (TextView) fragment.getView().findViewById(R.id.headerClienteTitleLabel);
		this.condPgto = (TextView) fragment.getView().findViewById(R.id.condPagto);
		this.nfSerie = (TextView) fragment.getView().findViewById(R.id.nfSerie);
		this.totalNota = (TextView) fragment.getView().findViewById(R.id.totalNota);
		this.foto = (ImageView) fragment.getView().findViewById(R.id.foto);
		this.foto.setOnClickListener(fotoMenu);
		this.tableProdutos = (TableLayout) fragment.getView().findViewById(R.id.tableProdutos);
		this.labelSemDesconto = (TextView) fragment.getView().findViewById(R.id.labelSemDesconto);
		this.tableDescontos = (TableLayout) fragment.getView().findViewById(R.id.tableAcresDesc);
		this.labelCondMedio = (TextView) fragment.getView().findViewById(R.id.labelConsMedio);
		this.tableHistMedicao = (TableLayout) fragment.getView().findViewById(R.id.tableHistMedicao);
		this.btnConcluirSimulacao = (Button) fragment.getView().findViewById(R.id.btnConcluirSimul);
		this.btnConcluirSimulacao.setOnClickListener(concluirSimulacao);
		this.btnObsVisita = (Button) fragment.getView().findViewById(R.id.btnObsVisita);
		this.btnObsVisita.setOnClickListener(obsVisita);
		this.textObservacao = (TextView) fragment.getView().findViewById(R.id.textObservacao);
		this.atualizarSimulacao();
		this.clienteBloqueado();
	}
	
	private boolean clienteBloqueado() {
		if(this.retornoNota.isRetornoAutorizacaoNota()) {
			if(this.retornoNota.isBloqueadoSefaz()) {
				DialogAlert.newInstance()
				.setTitle(R.string.dialog_title_alert)
				.setMessage(R.string.simulacao_nota_bloqueado_sefaz)
				.showDialog(fragment.getActivity().getSupportFragmentManager());
				return true;
			} else if(this.retornoNota.isEmitirContigencia()) {
				DialogAlert.newInstance()
				.setTitle(R.string.dialog_title_alert)
				.setMessage(R.string.simulacao_nota_emitir_contigencia)
				.setPositiveClick(emitirNotaContigencia)
				.showDialog(fragment.getActivity().getSupportFragmentManager());
				return true;
			}
		}
		return false;
	}
	
	OnClickListener obsVisita = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			DialogObservacao.newInstance(observacaoListener, textObservacao.getText().toString())
			.showDialog(fragment.getActivity().getSupportFragmentManager());
		}
	};
	
	DialogObservacaoListener observacaoListener = new DialogObservacaoListener() {
		
		@Override
		public void onConfirmarClick(String observacao) {
			observacao = StringUtility.trim(observacao);
			textObservacao.setText(observacao);
		}
	};
	
	OnClickListener fotoMenu = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			menuFoto();
		}
		
	};
	
	public void carregarImagem() {
		FogasUtility.camera.carregaImagem(fotoUri, foto, 50, 50);
	}
	
	private String nomeFoto() {
		//056_28_127636.jpg
		String nomeFoto = retornoNota.getNotaSimulacao().getTx_serie();
		nomeFoto += "_"+ retornoNota.getNotaSimulacao().getTx_nfnum();
		nomeFoto += "_"+ retornoNota.getNotaSimulacao().getTx_cod_cliente().getTx_cod_cliente();
		nomeFoto += ".jpg";
		return nomeFoto;
	}
	
	private String albumFoto() {
		//Medicao/0000016486/0000082912
		PlanoVisitas planoVisita = retornoNota.getNotaSimulacao().getTx_plano_visitas();
		String album = "Medicao";
		album += File.separator+ planoVisita.getLocal().getTx_cod_cliente();
		album += File.separator+ planoVisita.getCliente().getTx_cod_cliente();
		return album;
	}
	
	public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 1;
	
	private void menuFoto() {
		DialogMenuFoto menuFoto = DialogMenuFoto.newInstance(new DialogMenuFotoListener() {
			
			@Override
			public void onVisualizarClick(DialogFragment dialog) {
				FogasUtility.camera.abrirFoto(fotoUri, fragment.getActivity());
				dialog.dismiss();
			}
			
			@Override
			public void onCapturarClick(DialogFragment dialog) {
				try {
					File foto = FogasUtility.camera.criarArquivoFoto(albumFoto(), nomeFoto());
					fotoUri = Uri.fromFile(foto);
					Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
					intent.putExtra(MediaStore.EXTRA_OUTPUT, fotoUri);
					fragment.startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
					dialog.dismiss();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
		
		if(fotoUri != null) {
			menuFoto.setVisualizar(true);
		} else {
			menuFoto.setVisualizar(false);
		}
		
		menuFoto.showDialog(fragment.getActivity().getSupportFragmentManager());
	}
	
	OnClickListener concluirSimulacao = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			if(!clienteBloqueado()) {
				if(fotoCapturada()) {
					try {
						gravaOcorrencia();
						concluirSimulacao();
					} catch (SQLException e) {
						DialogAlert.newInstance()
						.setTitle(R.string.dialog_title_alert)
						.setMessage(R.string.simulacao_erro_gravar_ocorrencia)
						.showDialog(fragment.getActivity().getSupportFragmentManager());
					}
				}
			}
		}
	};
	
	private boolean fotoCapturada() {
		if(fotoUri == null) {
			DialogAlert.newInstance()
			.setTitle(R.string.dialog_title_alert)
			.setMessage(R.string.simulacao_sem_foto)
			.showDialog(fragment.getActivity().getSupportFragmentManager());
			return false;
		}
		return true;
	}
	
	DialogInterface.OnClickListener emitirNotaContigencia = new DialogInterface.OnClickListener() {

		@Override
		public void onClick(DialogInterface dialog, int which) {
			emitirNotaContigencia();
		}
	};
	
	private void emitirNotaContigencia() {
		EmitirNotaContigenciaBusiness business = new EmitirNotaContigenciaBusiness(fragment.getActivity(), 
				database, retornoNota.getNotaSimulacao());
		
		ProgressDialogBuilder dialog = new ProgressDialogBuilder(fragment.getActivity())
		.setMessage(fragment.getString(R.string.progress_msg_emissao_contigencia));
		
		ServiceTask task = new ServiceTask(dialog, business);
		task.execute();
	}
	
	private void gravaOcorrencia() throws SQLException {
		//Medicao/0000016486/0000082912/056_28_127636.jpg
		//File foto = new File(fotoUri.getPath());
		//String fotoEncodeBase64 = FogasUtility.file.base64EncodeToStringXmlTag(foto);
		
		String[] observacao = MedicaoUtils.observacaoOcorrencia(textObservacao.getText().toString());
		
		String[] split = StringUtility.split(fotoUri.getPath(), "/");
		String nomeFoto = split[split.length - 1];
		
		NotaOcorrencia ocorrencia = new NotaOcorrencia();
		ocorrencia.setFoto_nome(nomeFoto);
		//ocorrencia.setFoto_base64_data(fotoEncodeBase64);
		ocorrencia.setTx_plano_visita(retornoNota.getNotaSimulacao().getTx_plano_visitas());
		ocorrencia.setNb_sync(NotaOcorrenciaStatusEnum.PENDENTE.getId());
		ocorrencia.setTx_nota_fiscal(retornoNota.getNotaSimulacao());
		ocorrencia.setTx_plano(ApplicationFogas.getInstance().getConfiguracao().getAppDados().getPlano());
		ocorrencia.setTx_obs1(observacao[0]);
		ocorrencia.setTx_obs2(observacao[1]);
		ocorrencia.setTx_url1(nomeFoto);
		ocorrencia.setLocal_device_foto(fotoUri.getPath());
		database.getNotaOcorrencia().create(ocorrencia);
		retornoNota.getNotaSimulacao().setNotaOcorrencia(ocorrencia);
	}
	
	private void concluirSimulacao() {
		Intent intent = new Intent(fragment.getActivity(), ConcluirSimulNotaActivity.class);
		intent.putExtra(Constants.NOTA_SIMULACAO, retornoNota.getNotaSimulacao());
		fragment.startActivity(intent);
		fragment.getActivity().finish();
	}
	
	public void atualizarSimulacao() {
		try {
			panelDadosCliente(retornoNota.getNotaSimulacao());
			panelProdutos(retornoNota.getNotaSimulacao());
			panelDescontos(retornoNota.getNotaSimulacao());
			panelHistMedicao(retornoNota.getNotaSimulacao());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void panelDadosCliente(NotaFiscal notaFiscal) throws SQLException {
		String nome = new StringBuilder()
		.append(StringUtility.removeZeroEsquerdaString(notaFiscal.getTx_plano_visitas().getCliente().getTx_cod_cliente()))
		.append(" - ")
		.append(notaFiscal.getTx_plano_visitas().getCliente().getTx_nome())
		.toString();
		getLabelClientePanel().setText(nome);
		
		String condPgto = notaFiscal.getTx_cod_cliente().getTx_cod_cond_pagto().getTx_cod() +
				" - " + notaFiscal.getTx_cod_cliente().getTx_cod_cond_pagto().getTx_desc();
		String condPgtoAux = fragment.getString(R.string.label_simulacao_cond_pagto);
		condPgtoAux = StringUtility.replace(condPgtoAux, "#P#", condPgto);
		getCondPgto().setText(condPgtoAux);
		
		String nfSerie = fragment.getString(R.string.label_simulacao_nf_serie);
		nfSerie = StringUtility.replace(nfSerie, "#P1#", notaFiscal.getTx_nfnum());
		nfSerie = StringUtility.replace(nfSerie, "#P2#", notaFiscal.getTx_serie());
		getNfSerie().setText(nfSerie);
		
		String totalNota = fragment.getString(R.string.label_simulacao_total_nota);
		totalNota = StringUtility.replace(totalNota, "#P#", FogasUtility.string.currencyFormat(notaFiscal.getVl_valor_nota().doubleValue()));
		getTotalNota().setText(totalNota);
	}
	
	private void panelProdutos(NotaFiscal notaFiscal) {	
		
		for(NotaItem notaItem: notaFiscal.getNotaItems()) {
			TableRow linha = new TableRow(fragment.getActivity());
			
			colunaTable(linha, notaItem.getTx_material().getTx_cod_material());
			colunaTable(linha, String.valueOf(notaItem.getNb_qtde().intValue()));
			colunaTable(linha, notaItem.getTx_material().getTx_und());
			
			String vlUnit = FogasUtility.string.currencyFormat(notaItem.getVl_unitario().doubleValue());
			vlUnit = StringUtility.replace(vlUnit, "R$", "");
			colunaTable(linha, vlUnit.trim());
			
			String vltotal = FogasUtility.string.currencyFormat(notaItem.getVl_total().doubleValue());
			vltotal = StringUtility.replace(vltotal, "R$", "");
			colunaTable(linha, vltotal.trim());
			
			getTableProdutos().addView(linha);
		}
	}
	
	private void panelDescontos(NotaFiscal notaFiscal) {
		List<DescontosDto> descontos = NotaFiscalEngine.getDescontosNota(notaFiscal);
		if(descontos.isEmpty()) {
			getLabelSemDesconto().setVisibility(View.VISIBLE);
			getTableDescontos().setVisibility(View.GONE);
		} else {
			getTableDescontos().setVisibility(View.VISIBLE);
			getLabelSemDesconto().setVisibility(View.GONE);
			for(DescontosDto condicao: descontos) {
				TableRow linha = new TableRow(fragment.getActivity());
				
				colunaTable(linha, condicao.getCondicoesEnum().getDescricao());
				String vltotal = FogasUtility.string.currencyFormat(condicao.getValorTotal().doubleValue());
				vltotal = StringUtility.replace(vltotal, "R$", "");
				colunaTable(linha, vltotal);
				
				getTableProdutos().addView(linha);
			}
		}
	}
	
	private void colunaTable(TableRow linha, String value) {
		TextView textView = new TextView(fragment.getActivity());
		textView.setText(value);
		textView.setTextAppearance(fragment.getActivity(), R.style.TableItem);
		linha.addView(textView);
	}
	
	private void panelHistMedicao(NotaFiscal notaFiscal) throws Exception {
		List<MedidorHistorico> medicaoHistorico = database.getMedidorHistorico().listarHistoricoMedicaoPorCliente(notaFiscal.getTx_cod_cliente());
		
		String consumoMedio = fragment.getString(R.string.label_simulacao_cons_medio);
		consumoMedio = StringUtility.replace(consumoMedio, "#P#", 
				String.valueOf(notaFiscal.getTx_medidor().getVl_cons_medio().doubleValue())+" kg");
		labelCondMedio.setText(consumoMedio);
		
		//Hoje
		TableRow linha = new TableRow(fragment.getActivity());
		colunaTable(linha, "Hoje");
		colunaTable(linha, notaFiscal.getTx_medidor().getNb_leitura_atual());
		tableHistMedicao.addView(linha);
		
		for (MedidorHistorico medicao : medicaoHistorico) {
			
			linha = new TableRow(fragment.getActivity());
			
			colunaTable(linha, FogasUtility.data.getStringByDateAndFormat(medicao.getTs_ult_leitura(), "dd/MM/yyyy"));
			colunaTable(linha, medicao.getNb_ult_leitura());
			
			getTableHistMedicao().addView(linha);
		}
	}

	public FogasDatabase getDatabase() {
		return database;
	}

	public TextView getLabelClientePanel() {
		return labelClientePanel;
	}

	public TextView getCondPgto() {
		return condPgto;
	}

	public TextView getNfSerie() {
		return nfSerie;
	}

	public TextView getTotalNota() {
		return totalNota;
	}

	public ImageView getFoto() {
		return foto;
	}
	
	public TableLayout getTableProdutos() {
		return tableProdutos;
	}
	
	public TextView getLabelSemDesconto() {
		return labelSemDesconto;
	}
	
	public TableLayout getTableDescontos() {
		return tableDescontos;
	}
	
	public TextView getLabelCondMedio() {
		return labelCondMedio;
	}
	
	public TableLayout getTableHistMedicao() {
		return tableHistMedicao;
	}
	
	public Button getBtnConcluirSimulacao() {
		return btnConcluirSimulacao;
	}
}